from PyQt5.Qt import *

"""
信号(Signal)和槽(Slot)主要用来对象之间进行通讯
信号：当一个控件状态发送变化时，向外界发出的信息
槽：就是一个方法
1.所有继承QWidget的控件都支持"信号和槽"的机制
2.当信号发出时，连接的槽会自动执行

信号
1.控件内置，例如QPushButton().pressed, QPushButton().clicked等
2.也可以自定义

槽
1.控件内置槽函数
2.自定义槽函数

连接方式
object.信号.connect(槽函数)

特性
1.一个信号可以连接多个槽函数
2.一个信号可以连接另外一个信号
3.信号的参数可以是任何Python类型
4.一个槽可以监听多个信号


"""
class MyQWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setup_ui()

    def setup_ui(self):
        self.setWindowTitle("信号和槽")
        obj = QObject()
        obj.destroyed.connect(self.obj_destroy_sign)
        obj.objectNameChanged.connect(self.obj_name_changed) # 连接信号和槽
        # obj.objectNameChanged.disconnect() 取消连接信号和槽
        # 临时取消信号和槽的连接
        obj.blockSignals(True)
        # 信号是否被阻止
        print(obj.signalsBlocked())
        obj.blockSignals(False)
        print(obj.signalsBlocked())
        obj.setObjectName("信号和槽")
        # 返回信号的接收器数量
        print(obj.receivers(obj.objectNameChanged))

    def obj_destroy_sign(self):
        print("对象被释放了")
    def obj_name_changed(self):
        print("对象名字被修改了")
















# 测试
if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    window = MyQWidget()
    window.show()
    sys.exit(app.exec_())